/*
* Copyright 2008 Jeff Dwyer
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.apress.progwt.client.college.gui;
import com.allen_sauer.gwt.log.client.Log;
import com.apress.progwt.client.Interactive;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DecoratedTabPanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FormHandler;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.FormSubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormSubmitEvent;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.KeyboardListener;
import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.PopupListener;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
public class LoginWindow extends DialogBox {
private static final String SECURITY_URL = "j_acegi_security_check?gwt=true";
private FormPanel form;
private Label messageLabel;
private LoginListener listener;
private TextBox username;
/**
* this has the secureTargetURL which is a way for us to get to the
* right page even after a reloaction to OpenID login.
*/
private String secureTargetURL;
private static boolean semaphore = false;
private static String lastNameEntered = "";
/**
* Prevents multiple instances with a semaphore.
*
* @param ConstHolder.myConstants -
* NOTE: this is used by both AddLink & Hippo modules, so
* we can't rely on Manager.ConstHolder.myConstants being
* initialized.
*
* @param manager
*/
public LoginWindow(LoginListener listener, String secureTargetURL) {
super(false, false);
this.secureTargetURL = secureTargetURL;
this.listener = listener;
if (semaphore == false) {
Log.debug("CREATING LoginWindow");
semaphore = true;
} else {
Log.debug("KILLING LoginWindow");
hide();
return;
}
setText("Please Login");
setupForm();
addPopupListener(new PopupListener() {
public void onPopupClosed(PopupPanel sender,
boolean autoClosed) {
semaphore = false;
}
});
setWidget(form);
setStyleName("TC-Popup");
}
private void setupForm() {
form = new FormPanel();
form.setAction(Interactive.getRelativeURL(SECURITY_URL));
form.setMethod(FormPanel.METHOD_POST);
// Create a panel to hold all of the form widgets.
VerticalPanel panel = new VerticalPanel();
DecoratedTabPanel tabs = new DecoratedTabPanel();
tabs.add(getOpenIDTab(), "OpenID");
tabs.add(getUPTab(), "Username/Password");
tabs.selectTab(1);
panel.add(tabs);
messageLabel = new Label("");
panel.add(messageLabel);
form.addFormHandler(new FormHandler() {
// note, this doesn't need to be perfectly secure. We just
// want to know that we think we're secure. The next request
// will tell us for sure
public void onSubmitComplete(FormSubmitCompleteEvent event) {
Log.debug("submit event results " + event.getResults());
if (event.getResults().equals("OK")) {
success();
} else {
Log.warn("Login Fail: " + event.getResults());
failure();
}
// // TODO parse bad password etc. Super-Fragile string
// comps
// if (event.getResults() == null
// || -1 != event.getResults().indexOf(
// "not successful")
// || -1 != event.getResults().indexOf(
// "Bad credentials")
// || -1 != event.getResults().indexOf("404")) {
// Log.warn("Login Fail: " + event.getResults());
// failure();
// } else {
// Log.info("Login Success");
// Log.debug(event.getResults());
// success();
// }
}
public void onSubmit(FormSubmitEvent event) {
Log.debug("submit to " + form.getAction());
// This event is fired just before the form is submitted.
// We can take
// this opportunity to perform validation.
// if (username.getText().length() == 0) {
// AlertDialog.alert("Username cannot be empty");
// event.setCancelled(true);
// }
// if (password.getText().length() == 0) {
// AlertDialog.alert("Password cannot be empty");
// event.setCancelled(true);
// }
lastNameEntered = username.getText();
}
});
form.setWidget(panel);
}
private Widget getUPTab() {
VerticalPanel uptab = new VerticalPanel();
username = new TextBox();
username.setName("j_username");
username.setText(lastNameEntered);
KeyboardListener enterListener = new KeyboardListenerAdapter() {
public void onKeyPress(Widget sender, char keyCode,
int modifiers) {
if (keyCode == KEY_ENTER) {
form.submit();
}
}
};
final PasswordTextBox password = new PasswordTextBox();
password.setName("j_password");
password.addKeyboardListener(enterListener);
username.setText("test");
password.setText("testaroo");
HorizontalPanel userP = new HorizontalPanel();
userP.add(new Label("Username"));
userP.add(username);
HorizontalPanel passPanel = new HorizontalPanel();
passPanel.add(new Label("Password"));
passPanel.add(password);
uptab.add(userP);
uptab.add(passPanel);
uptab.add(new Button("Login", new ClickListener() {
public void onClick(Widget sender) {
form.submit();
}
}));
return uptab;
}
private Widget getOpenIDTab() {
HorizontalPanel hP = new HorizontalPanel();
hP
.add(new ExternalLink("Do OpenID login", secureTargetURL,
true));
return hP;
}
private void failure() {
// messageLabel.setText(ConstHolder.myConstants.login_failure());
messageLabel.setText("Failure");
}
private void success() {
// messageLabel.setText(ConstHolder.myConstants.login_success());
messageLabel.setText("Success");
listener.loginSuccess();
Timer t = new Timer() {
public void run() {
// free up the login lock for next time
semaphore = false;
hide();
}
};
t.schedule(2000);
}
}